2016年くらい(?)に流行った、Macの開発環境構築をAnsibleで自動化するお話。
新しいMacを手に入れたときにオレオレ環境を再現する用途がほとんどだと思います。
クラウドにインスタンスを立ててリモート開発環境で快適に。
というのが主流になりつつある昨今需要は減っているかもしれません。
それでも、
- このアプリ入ってないの?(ハイッテヘンヨ!)
- このvscode拡張のこの設定は必須でしょ。(シランモン!)
- 必要なツールどっかのwikiにあるよ。(ドコヤネン。。。)
というのは(たぶん)起こっているはず。
そんなお困りごとを解決できればいいなと思い、テンプレートを作成しました。
基本的にはメンテするのは一つのymlファイルだけでよい作りになっています。
※ 今回「全部シェルでええやん」はご勘弁ください。。。
できるもの
https://github.com/kohbis/mac-ansible/tree/template
"説明トカイラナイヨ!"という方は、こちらだけお収めください。
Ansibleとは
- 構成管理/オーケストレーション/デプロイメント ツール
- RedHat社が開発
- エージェントレス
- 処理をplaybook(yaml形式)で管理
[参考]
・Ansibleをはじめる人に。
https://qiita.com/t_nakayama0714/items/fe55ee56d6446f67113c
・Ansible実践入門
https://dev.classmethod.jp/server-side/ansible/practice_ansible/
構成
今回は最小限の構成で、そこからカスタマイズできるテンプレートにしています。
エディタはVSCodeとVimを対象にしていますが、基本は変わらないのでAtom等もテンプレートを参考にしていただければと思います。
.
├── README.md
├── ansible.cfg
├── group_vars
│ └── localhost.yml #メンテナンス対象
├── inventory
│ └── localhost
├── localhost.yml #playbook
└── roles
├── dotfiles
│ ├── tasks
│ │ └── main.yml
│ └── template
│ ├── template.bash_profile #必要であれば編集
│ ├── template.bashrc #必要であれば編集
│ └── template.vimrc #必要であれば編集
├── homebrew
│ └── tasks
│ └── main.yml
├── homebrew_cask
│ └── tasks
│ └── main.yml
└── vscode
├── tasks
│ └── main.yml
└── templates
├── keybindings.json #必要であれば編集
└── settings.json #必要であれば編集
作業は
-
README.md
の通り、シェルをダウンロードして実行。 - 時々Enterを押したり、パスワードを入力。
だけです。
アプリによってパスワードが必要になったりするので完全な自動化ができないのが何とも言えないところですね。
「できるよ!!」という方いらっしゃいましたらご教授いただければありがたいです。
curl -O https://raw.githubusercontent.com/kohbis/mac-ansible/template/setting.sh
chmod 755 ./setting.sh
sh ./setting.sh
setting.sh
Macではお決まりのcommand line tools
とhomebrew
をインストールし、ansible-playbook
を実行します。
ANSIBLE_PATH
は適当なディレクトリに変更して問題ありません。
#!/bin/bash
ANSIBLE_PATH=~/workspace/settings/mac-ansible
## command line tools
xcode-select --install
## install homebrew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
## install ansible
brew install ansible
## clone repo
git clone -b template https://github.com/kohbis/mac-ansible.git ${ANSIBLE_PATH}
## ansible
cd ${ANSIBLE_PATH}
ansible-playbook -i inventory/localhost localhost.yml # --tags "タグ名" 指定可能
ansible.cfg
inventoryディレクトリの指定のみ。
[defaults]
inventory = ./inventory
localhost.yml
使用するplaybook
です。
roles
に定義したtask/main.yml
の処理が実行されます
実行したくない場合は、roles
から記載を消せばよいです。
- hosts: localhost
connection: local
gather_facts: no
become: no
roles:
- homebrew
- homebrew_cask
- dotfiles
- vscode
inventory
localhost
自分自身を対象にするのでローカルホストを指定します。
[localhost]
127.0.0.1
group_vars
localhost.yml
homebrewやvscode拡張機能などの一覧を管理します。
必要、推奨アプリを初期段階でインストールできるので、後世の人々が苦労せずに済みますね。
homebrew_taps:
- homebrew/cask
- homebrew/core
homebrew_packages:
- name: ansible
- name: awscli
## (中略) ##
- name: vim
- name: wget
homebrew_cask_packages:
- name: appcleaner
- name: cyberduck
## (中略) ##
- name: station
- name: visual-studio-code
dot_files:
- .bash_profile
- .bashrc
- .vimrc
code_extensions:
- vscode-icons-team.vscode-icons
できるだけ削ったつもりですが、それでも多くなってしまいました。。。
今使用しているMacからリストを作りたい場合は、こちらのコマンドをご利用ください。
(dot_filesはよしなに)
echo "homebrew_taps:" && brew tap | awk '{print " - "$1}'
echo "homebrew_packages:" && brew list | awk '{print " - name: "$1}'
echo "homebrew_cask_packages:" && brew list --cask | awk '{print " - name: "$1}'
echo "code_extensions:" && code --list-extensions | awk '{print " - "$1}'
roles
homebrew
task
最初にbrew tap
してformulaを追加するようにしておきます。
- block:
- name: homebrew update
homebrew:
update_homebrew: yes
- name: homebrew tap
homebrew_tap:
name: '{{ item }}'
state: present
with_items: '{{ homebrew_taps }}'
- name: homebrew packages install
homebrew:
name: '{{ item.name }}'
state: '{{ item.state | default("present") }}'
with_items: '{{ homebrew_packages }}'
tags:
- homebrew
homebrew_cask
task
GUIアプリもインストールできるのが、homebrewのいいところだと思います。
インストール先は/Applications
を明示しておきます。
- block:
- name: homebrew cask packages install
homebrew_cask: name={{ item.name }} state=installed
environment:
HOMEBREW_CASK_OPTS: "--appdir=/Applications"
with_items: '{{ homebrew_cask_packages }}'
tags:
- homebrew_cask
dotfiles
task
templatesからホームディレクトリにコピーします。
個人用には随時アップデートしたくなると思うので、別リポジトリで管理してシンボリックリンクをはるのがおすすめです。
- block:
########
# copy #
########
- name: copy dotfiles
template:
src: template{{ item }}
dest: ~/{{ item }}
with_items: '{{ dot_files }}'
#################
# symbolic link #
#################
# - name: checkout dotfiles
# git:
# repo: https://github.com/{your_repository}/dotfiles.git
# dest: ~/dotfiles
# - name: create symlinks
# file:
# src: ~/dotfiles/{{ item }}
# dest: ~/{{ item }}
# state: link
# force: yes
# with_items: '{{ dot_files }}'
tags:
- dotfiles
template
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
.bash_profile
は初期のままで大丈夫でしょう。
# alias ls='ls -G'
特にprompt表示やaliasを共有できるのは便利です。
" set number
vimの沼設定も移行できます。
vscode
task
libraryディレクトリは、先んじて作成しておきます。
vscodeだと管理したい設定ファイルは、setting.json
と keybinding.json
くらいでしょうか。
個人的には ~/Library/Application Support/Code/User/snippets/
も管理できるのでおすすめです。
- block:
- name: visual studio code library directory
file:
path="~/Library/Application Support/Code/User"
state=directory
- name: visual studio code basic setting
template:
src: settings.json
dest: "~/Library/Application Support/Code/User"
mode: 0644
- name: visual studio code keybindings
template:
src: keybindings.json
dest: "~/Library/Application Support/Code/User"
mode: 0644
- name: visual studio code install extension
raw: "code --install-extension {{ item }}"
with_items: '{{ code_extensions }}'
tags:
- vscode
template
jsonの中身はコメントアウトしています。
{
// "extensions.ignoreRecommendations": true,
// "editor.minimap.enabled": false,
}
VSCode本体や拡張機能の詳細な設定、コード規約(後者は各projectで管理したいところですが)などを共有できると何かと便利です。
[
// { "key": "cmd+shift+k", "command": "workbench.action.terminal.focusNext" },
// { "key": "cmd+shift+j", "command": "workbench.action.terminal.focusPrevious" },
]
keybindingは個人の趣向があるので、あまり必要ないかもしれませんね。
最後に
本投稿では紹介していないけれど、できることはまだまだあります。
GitHubで mac-ansible
等で検索すれば、先人たちの恩恵を受けられます。
https://github.com/search?q=mac-ansible
mas-cliでMacAppStoreのアプリをインストールすることも可能です。
一応筆者の ansible-plyabook のURLを貼っておきます。
https://github.com/kohbis/mac-ansible
(完全自分用でmasterを更新しまくっているのでご参考までに)
新しいMacを渡されて、ある程度のセットアップまではできるのは本当にありがたいですね。
結局みんな好きずきにカスタマイズするでしょうけど笑。